package com.mes.common.dao;

import java.sql.ResultSet;
import java.util.List;
import java.util.Map;

import org.hibernate.impl.AbstractQueryImpl;

import com.mes.common.condition.Conditions;
import com.mes.common.exception.bo.BaseBusinessException;
import com.mes.common.exception.db.BaseDBException;


/**
 * <p>
 * 执行查询的接口，为了优化查询，充分利用Hibernate的缓存等策略，建议使用带有Conditions的方法，而不是是用HQL直接查询
 * </p>
 * 
 * <p>
 * Created on Mar 12, 2008
 * </p>
 * 
 * @author lhy
 * 
 */
public interface IExecuteQueryDao {
	/**
	 * 根据给出的HQL语句进行查询 不建议是用HQL语句直接查询，而需要把参数写成？的形式
	 * 
	 * @param hql
	 * @return
	 * @throws BaseDBException
	 */
	public List getQuery(String hql) throws BaseDBException;

	/**
	 * 根据给出的条件进行查询，首先把条件转化为HQL
	 * 
	 * @param objectName
	 * @param conditions
	 * @return
	 * @throws BaseDBException
	 */
	public List getQuery(String objectName, Conditions conditions)
			throws BaseDBException;

	/**
	 * 根据给出的HQL语句和返回记录的条数进行查询，如果from和size有一个为空，则将不把返回记录数作为条件了，如果size为负值，则将抛出错误。
	 * 不建议是用HQL语句直接查询，而需要把参数写成？的形式
	 * 
	 * @param hql
	 * @param from
	 * @param size
	 * @return
	 * @throws BaseDBException
	 */
	public List getQuery(String hql, Integer from, Integer size)
			throws BaseDBException;

	/**
	 * 根据给出的条件进行查询，首先把条件转化为HQL
	 * 
	 * @param conditions
	 * @return
	 * @throws BaseDBException
	 */
	public List getQuery(String objectName, Conditions conditions, Integer from,
			Integer size) throws BaseDBException;

	/**
	 * 根据给出的HQL语句进行更新操作，此处不用写事物，最后的事务处理都交给Spring去完成
	 * 
	 * @param hql
	 * @return
	 * @throws BaseDBException
	 */
	public Boolean update(String hql) throws BaseDBException;

	/**
	 * 根据给出的SQL语句去执行查询操作
	 * 
	 * @param sql
	 * @return
	 * @throws BaseDBException
	 */
	@Deprecated
	public ResultSet getQueryBySql(String sql) throws BaseDBException;

	/**
	 * 根据给出的SQL语句去执行更新操作
	 * 
	 * @param sql
	 * @return
	 * @throws BaseDBException
	 */
	@Deprecated
	public Boolean updateBySql(String sql) throws BaseDBException;
	
	
	/**
	 * 根据给出的hql和查询条件参数得到该查询的总记录数
	 * 
	 * @param conditions
	 * @return
	 * @throws BaseBusinessException
	 */
	public Integer getObjectCount(final String hqlConditions,Map parameters)
			throws BaseBusinessException;	
	
	/**
	 * 根据给出的hql和查询条件参数得到该查询的总记录数
	 * 
	 * @param conditions
	 * @return
	 * @throws BaseBusinessException
	 */
	public Integer getObjectCount(AbstractQueryImpl query)
			throws BaseBusinessException;	


}
